package com.seu.me.thread.day1.sync006;

/**
 * synchronized代码块对字符串的锁，注意String常量池的缓存功能
 * 因为JVM有一种优化机制，因为String类型的对象是不可变的，因此当你使用""的形式引用字符串时，
 * 如果JVM发现内存已经有一个这样的对象，那么它就使用那个对象而不再生成一个新的String对象，
 * 这样是为了减小内存的使用，所以同步阻塞
 *
 * @author liangfeihu
 */
public class StringLock {

    public String lock = new String("字符串常量");

    public void method() {
        synchronized (lock) {
            //synchronized (new String("字符串常量")) {
            //synchronized ("字符串常量") {
            try {
                while (true) {
                    System.out.println("当前线程 : " + Thread.currentThread().getName() + " 开始");
                    Thread.sleep(1000);
                    System.out.println("当前线程 : " + Thread.currentThread().getName() + " 结束");
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

    public static void main(String[] args) {
        final StringLock stringLock = new StringLock();

        Thread t1 = new Thread(new Runnable() {
            @Override
            public void run() {
                stringLock.method();
            }
        }, "t1");

        Thread t2 = new Thread(new Runnable() {
            @Override
            public void run() {
                stringLock.method();
            }
        }, "t2");

        t1.start();
        t2.start();
    }

}
